package com.example.consumer.service;

import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

import java.io.IOException;

/**
 * @description:
 * @program: demos
 * @author: dove
 * @date: 2020-12-09 00:59
 **/

@Component
public class TestMessageService {

    /**
     * 参数可以写以下类型：
     *  1.Object message
     *  2.Message message
     *  3.User user：T <发送消息的类型>
     *  4.Channel channel: 当前传输数据的通道
     *  5.以上参数同时出现一个以上的情况
     *  Queue: 可以被多人监听，只要收到消息，就删除队列中的消息。只能有一个收到消息。
     *  1.同一个消息只有一个客户端能收到
     *  2.只有一个消息处理完，方法运行结束，才可以接收到下一个消息
     *
     *  手动ACK需要：
     *      1.spring.rabbitmq.listener.simple.acknowledge-mode=manual
     *      2.channel.basicAck(deliveryTag, false);
     *        channel.basicNack(deliveryTag, false, true);
     *        channel.basicReject(deliveryTag,true);
     */
    @RabbitListener(queues = {"hello-java-queue"})
    public void recieveMessage(Message message, Channel channel){
        System.out.println("接收到的消息是："+message);
        // deliveryTag: channel内自增的
        long deliveryTag = message.getMessageProperties().getDeliveryTag();
        // 手动确认，非批量模式
        try {
            // long deliveryTag , bool multiple
            // 手动确认，支持批量
            channel.basicAck(deliveryTag, false);
            // long deliveryTag , bool multiple , bool requeue
            // 手动拒绝，支持批量
//            channel.basicNack(deliveryTag, false, true);
            // long deliveryTag , bool requeue
            // 手动拒绝，不支持批量
//            channel.basicReject(deliveryTag,true);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
